#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
	//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//ADC分频
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);			//最高频率为14MHz，6分频为72/6=12MHz
	
	//配置GPIO
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;			//模拟输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA0引脚初始化为模拟输入
	
	
	//ADC初始化
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;						//指定为单次转换模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;					//数据右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;		//不要外部触发，使用软件触发
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;						//独立模式，单独使用ADC1
	ADC_InitStructure.ADC_NbrOfChannel = 1;									//通道数
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;							//不要扫描
	ADC_Init(ADC1, &ADC_InitStructure);
	
	//开启ADC转换
	ADC_Cmd(ADC1, ENABLE);
	
	//校验
	ADC_ResetCalibration(ADC1);												//复位校准标志位
	while(ADC_GetResetCalibrationStatus(ADC1) == SET);						//等待复位完成
	ADC_StartCalibration(ADC1);												//校准
	while(ADC_GetCalibrationStatus(ADC1) == SET);							//等待校准完成
}

/**
  * @brief		获取指定通道的AD转换值
  * @parm		无
  * @retval		AD转换值
  */
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
	
	//ADC通道
	//								通道		 序列        采样时间
	ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
	//软件触发AD转换
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);					//等待EOC标志位置1
	return ADC_GetConversionValue(ADC1);
}

